perm filename GUNLO.SAI[SYS,HE] blob
sn#106015 filedate 1974-06-07 generic text, type C, neo UTF8
COMMENT ⊗ VALID 00017 PAGES
C REC PAGE DESCRIPTION
C00001 00001
C00003 00002 GUNLO - the driver program
C00005 00003 _ global storage
C00007 00004 _ external procedures
C00009 00005 _ initialize program
C00011 00006 _ set adjustable constants
C00012 00007 _ outer-level dynamic storage allocation
C00015 00008 _ initialization and program (command) loop of BLOCK3.
C00017 00009 _ command decoding loop
C00020 00010 _ sub-command decoding - DO, MARK, UNMARK, PLOT
C00022 00011 _ more sub-command decoding - EDIT, KILL, PRINT
C00024 00012 _ more sub-command decoding - SET
C00026 00013 _ more sub-command decoding - CALL
C00028 00014 _ more sub-command decoding - SHOW
C00032 00015 _ more sub-command decoding - NO, SAV
C00034 00016 _ more sub-command decoding - RECEIVE
C00036 00017 _ end of sub-command decoding - INPUT
C00038 ENDMK
C⊗;
COMMENT GUNLO - the driver program;
BEGIN "GUNLO"
REQUIRE "PREAMB.SAI[SYS,HE]" SOURCE_FILE;
REQUIRE "SYS:PROCES.DEF" SOURCE_FILE;
REQUIRE "DPYSUB.HDR[SYS,HE]" SOURCE_FILE;
REQUIRE "HELIB[1,3]" LIBRARY;
REQUIRE "LINE[SYS,HE]" LOAD_MODULE,
"LINVER[SYS,HE]" LOAD_MODULE,
"SCENE[SYS,HE]" LOAD_MODULE,
"FORSER[SYS,HE]" LOAD_MODULE,
"SAISER[SYS,HE]" LOAD_MODULE,
"SAIDIS[SYS,HE]" LOAD_MODULE,
"PROT[SYS,HE]" LOAD_MODULE,
"SAVRES[SYS,HE]" LOAD_MODULE,
"MAPS1[SYS,HE]" LOAD_MODULE,
"MAPS2[SYS,HE]" LOAD_MODULE,
"GUNFAI[SYS,HE]" LOAD_MODULE;
DEFINE QFOP="FORWARD PROCEDURE",
QRI="REFERENCE INTEGER",
QEP="EXTERNAL SIMPLE PROCEDURE",
QENP="EXTERNAL PROCEDURE",
QEIP="EXTERNAL SIMPLE INTEGER PROCEDURE",
QERP="EXTERNAL SIMPLE REAL PROCEDURE",
QS="STRING",
QESP="EXTERNAL SIMPLE STRING PROCEDURE",
QRA="REAL ARRAY",
QIA="INTEGER ARRAY",
QR="REAL",
QI="INTEGER",
CL="'15&'12",
QRR="REFERENCE REAL",
_="COMMENT",
QUNFIN="IF BRCHAR='12 THEN GO COMND ELSE GO",
QUEST="OUTCHR(""?"")",
QRETURN="BEGIN UNTELL; RETURN END",
LOOP(I,J,K,L)="FOR I←J STEP L UNTIL K DO",
QERR="IF ERR THEN BEGIN ERR←0; GO COM2 END",
QFTREV="IF FTREV=1 THEN ""←"" ELSE ""→""",
NUMI="CVD(QREAD)",
SAFEX="SAFE";
_ global storage;
LABEL BL1;
INTERNAL STRING H,COMSTR,NAME,MFILE,COMSAV,LIEXT,EDEXT,PREXT;
INTERNAL REAL RDEP,RMEDA,SHRINK,RDDP,RDNP,RMSD,RMLG,RWIC,RMLE,RCDI,RMALS,
RMRLS,RDUM,RMSAF,RELLF,RMAP,IRX,IRY,DSCX,DSCY,ISCX,ISCY;
INTERNAL INTEGER IDUM,IA,IB,IC,ID,IE,WHERE,BRCHAR,NGRF,NPAR,NOV,
NLPT,CVLIN,IWHAT,NOEPL,NOEPM,NOEPA,NOL,IFREEL,IFREEV,
MAXNOL,MSAFA,NOBAL,MAXNOV,LDATE,ILLL,ILFL,LNCRE1,LNCRE2,MODE,
SCALE,SIZE,LOCB,LOCT,ORIGX,ORIGY,WIND,DHOLD,IAEDG,MCHAN,MTRACE,
MODIF,FULREC,ERR,PLTOT,NPRO,PFFREE,PLFTOT,MXNPRO,MAXPLT,DISLAS,
DISFUS,PLT,NODIS,MAXPFT,PFTOT,PCFTOT,NOLS,EDLIN,FTREV,SCF,
MAXSCF,PFREE,MAXPLS,MAXPVS,MAPTRC,PFTKEY,MEOF,X,Y,DRX,DRY,DFORCE,
CFILES,NOUT,III,FRAME,XTRACE;
SAFEX INTERNAL INTEGER ARRAY DICH,DION,DISP,DISPS,DADR,DBRSI[0:15],MCHN[1:10];
SAFEX INTERNAL STRING ARRAY CMSTRS[0:9],CMSAV[1:10];
INTEGER EDGMIN, LINMIN;
_ external procedures ;
QEIP LINFIT;
QEP INITIA;
QEP TELL(QS S);
QEP UNTELL;
QEIP QSET(QRI I);
QESP QREAD;
QEP SETPAR;
QEP COMST;
QENP SORTED;
QEP EDSAVE;
QEP EDREST;
QEP LISAVE;
QEP LIREST;
QEP PRSAVE;
QEP PRREST;
QEP REGREF(QI I);
QENP XREFC(QI I);
QEP TRANSUP;
QEP UNXREF;
QEP PRECAL;
QEP CALC;
QEP FILESP(QI I);
QEP UPPDAT;
QEP LINED;
QEP RELOPT;
QEIP BITS(QI I,J,K);
QESP EXPL(QI I,J; QS S);
QEIP LNFEAT(QI I);
QEIP COFEAT(QI I,J,K,L);
QEIP FINDFT(QI I);
QEP PARSE;
QEP CREPRO;
QEP SHUFFL;
QEP FTEX;
QERP QRSET(QRR R);
QEIP DISX(QR X);
QEIP DISY(QR Y);
QEIP LFDIF(QI I,J,K,L,T);
QEIP MAPCONV(QS CODES);
QEP OUTLINES;
QEP K_ZERO;
QEP K_OUT;
QEP SUMINT(QRR A,B,C,D; QRI E);
QEP EDGPRT;
QEP LININT(QRR T,U,V,W,X,Y,Z);
QEP LNINTA(QRI LVR, LVI; QRR XV,YV; QRI LC, LV, LI);
QEP PROINT(QRI PR);
QEP INTSTR; QEP EDREC;
QEP SAIINT(BOOLEAN TTY,PTY,MAIL);
_ initialize program;
STDBRK(3);
SETFORMAT(0,2);
SETBREAK(13,'12&'40&"*?:⊗;",'15,"INS");
SETBREAK(11,'40,NULL,"XRN");
SETBREAK(12,".",NULL,"INS");
SETBREAK(2,".[]"&'12,'15,"INS");
SETBREAK(6,"."," "&'12&'15&" ","IRN");
LOOP(IA,1,14,1)
BEGIN
DISP[IA] ← DION[IA] ← 0;
DICH[IA] ← 1;
END;
DISP[1] ← DISP[2] ← DISP[4] ← DISP[5] ← DISP[14] ← 1;
CMSTRS[0] ← "INPUT*PROT*PROTO.GUN[SYS,HE]*";
CMSTRS[1] ← "H*SET*DISRPT*0*0*SCALE*5*5*LNCRE*1*1*CVLIN*1*"&
"CALL*LINFIT*UNMARK*LINES*KILL*FRAME*EDGES*D*";
CMSTRS[2] ← "H*CALL*PARSE*NULL*SET*LNCRE*2000*2999*D";
INTMAP(INTTTY_INX,INTSTR,0);
INTMAP(INTMAIL_INX,INTSTR,0);
SAIINT(TRUE,FALSE,TRUE);
ENABLE(INTTTY_INX);
ENABLE(INTMAIL_INX);
FRAME ← GETPOG;
PUT_DATA(0,0,"GUNLO");
OVERLAY ← TRUE;
YES_GUN ← TRUE;
_ initialize variables;
LNCRE1 ← LNCRE2 ← WHERE ← LDATE ← PFFREE ← PFREE ← 1;
IWHAT ← CVLIN ← WIND ← CFILES ← MAXPLS ← MAXPVS ← MODE ← DFORCE
← DHOLD ← MTRACE ← PLT ← NODIS ← PLTOT ← PLFTOT ← PCFTOT
← NOBAL ← XTRACE ← PFTOT ← NPRO ← SCF ← 0;
NPAR ← 28;
NOEPM ← 50;
NOUT ← NGRF ← NLPT ← "A";
MFILE ← COMSTR ← COMSAV ← NULL;
NAME ← "GUN";
LIEXT ← EDEXT ← PREXT ← ".TEM";
_ set adjustable constants;
LINMIN ← 250;
EDGMIN ← 200;
MSAFA ← 30;
RMSAF ← 0.5;
RMEDA ← 90.;
SHRINK ← 0.5;
RDDP ← 1.5;
RDNP ← 0.45;
RMSD ← 0.3;
RMLG ← 0.;
RWIC ← 3.5;
RMLE ← 15.;
RCDI ← 5.;
RELLF ← 0.18;
RMALS ← 5.;
RMRLS ← 0.3;
ILLL ← 2;
ILFL ← 3;
RDEP ← 0.5;
RMAP ← 12.;
MXNPRO ← 15;
_ set display parameters
ORIGX ← 163;
ORIGY ← 165;
SCALE ← 750;
SIZE ← 2;
IRX ← 150.;
IRY ← 115.;
DRX ← 215;
DRY ← 150;
DSCX ← DSCY ← 2.5;
ISCX ← ISCY ← 0.4;
_ outer-level dynamic storage allocation;
_ * * Prototype data-structure. * * *;
BL1: MAXPFT←4*(MAXPLT←12*MXNPRO);
BEGIN "BLOCK1"
LABEL BL2;
SAFEX INTERNAL STRING ARRAY PNAME[1:MXNPRO];
SAFEX INTERNAL INTEGER ARRAY PLINES,PVERTS,PPTRL[1:MXNPRO],
PFLST,PFPRO,PFEAT[1:MAXPFT],
PFPTR[0:MAXPFT],PLINE,PLINE2,PLINEF[1:MAXPLT];
PROINT(PLINEF[1]);
IF WHERE≠1 THEN PRREST;
_ * * * Edge-storage arrays. * * * * *;
BL2: NOEPL←(NOEPA MAX EDGMIN)+NOEPM;
BEGIN "BLOCK2"
LABEL BL3;
SAFEX INTERNAL REAL ARRAY EAX,EAY,EBX,EBY[1:NOEPL];
SAFEX INTERNAL INTEGER ARRAY LE[1:NOEPL];
SUMINT(EAX[1],EAY[1],EBX[1],EBY[1],LE[1]);
IF WHERE≠1∧WHERE≠10 THEN EDREST;
_ * * * Line data-structure. Display-buffer. * * * * *;
BL3: NOBAL ← NOBAL MAX LINMIN;
MAXSCF ← 2*(MAXNOV ← 2*(MAXNOL ← NOBAL+NOBAL*RMSAF+MSAFA));
DISLAS ← NOEPL+NOEPL%10+4*MAXNOV+280;
BEGIN "BLOCK3"
SAFEX INTERNAL INTEGER ARRAY DISBUF[1:DISLAS+2],LEDG1,LEDG2,LCREDE,
LFEAT[1:MAXNOL],LVERSI,LVERCO,LVER,LINK[1:MAXNOV],
CFEAT[1:MAXSCF];
SAFEX INTERNAL REAL ARRAY XVCOR,YVCOR,SVANG,XLCOR,YLCOR[1:MAXNOV],
CXL,CYL,CCL,RLEN,ANGARG[1:MAXNOL];
LABEL COMND,COM1,COM2,MARK,UNMARK,CALL1,SHOW,KILL,SETT,PRINT,CALL,
CPA,SAV,INP,INP1,PLOT,DOIT,EDIT,DD,NO,NO1,UPLIN,COM3,
RECEV,REC1;
LININT(CXL[1],CYL[1],CCL[1],ANGARG[1],RLEN[1],XLCOR[1],YLCOR[1]);
LNINTA(LVERCO[1],LVERSI[1],XVCOR[1],YVCOR[1],LCREDE[1],LVER[1],
LINK[1]);
III←-1;
START_CODE DEFINE TTY="'51000000000"; TTY 6,III; END;
III ← IF III<0 THEN LOCATION(DISBUF[1])-1 ELSE 0;
_ initialization and program (command) loop of BLOCK3.;
IF WHERE≠1 THEN BEGIN UNTELL; LIREST END;
_ initialize display routines;
DPYSET(DISBUF);
DISFUS←DPYPARS-1;
RELOPT;
OVERLAY←TRUE;
DADR[1]←4;
DBRSI[1]←'4046;
DADR[2]←14;
DBRSI[2]←'4046;
DADR[3]←IA←55+NOEPL+NOEPL%10;
DBRSI[3]←'1046;
DADR[4]←IA←IA+210;
DBRSI[4]←'4046;
DADR[5]←IA←IA+MAXNOV+5;
DBRSI[5]←'1046;
DADR[6]←IA←IA+MAXNOV+5;
DBRSI[6]←'1046;
DADR[7]←IA+2*MAXNOV+5; _ Last pog. is a dummy (for jump address);
INITIA;
TRANSUP;
NODIS←0;
_ dispatch when returning from array expansion-contraction;
CASE WHERE OF BEGIN
;
"1-normal value" ;
"2-LINEFIT" GO CALL1;
"3-NOEDGES" GO NO1;
"4-CONTRACT" GO COM3;
"5-INSERT" BEGIN LINED; GO COM2 END;
"6-SPLITL" BEGIN LINED; GO COM2 END;
"7-NOLINES" GO NO1;
"8-LIREST" GO INP1;
;
"10-EDREC" GO REC1;
"11-EDREST" GO INP1;
;;;;
"16-PRO-LNSRT" BEGIN CREPRO; GO COM2 END;
"17-PRREST" GO INP1;
"18-PRO-NPRO" BEGIN CREPRO; GO COM2 END;
"19-PRO-MXPLT" BEGIN CREPRO; GO COM2 END;
"20-PARSE" GO CPA;
END;
_ command decoding loop;
COMND: IF ¬MODE THEN
BEGIN
OUTSTR(CL&"$"&CL);
MODE ← -1;
END;
H←QREAD;
COM1: IF EQU(H,"DO") THEN GO DOIT;
IF EQU(H,"DD") THEN GO DD;
IF EQU(H,"MARK") THEN GO MARK;
IF EQU(H,"UNMARK") THEN GO UNMARK;
IF EQU(H,"EDIT") THEN GO EDIT;
IF EQU(H,"SET") THEN GO SETT;
IF EQU(H,"CALL") THEN GO CALL;
IF EQU(H,"SHOW") THEN GO SHOW;
IF EQU(H,"KILL") THEN GO KILL;
IF EQU(H,"PRINT") THEN GO PRINT;
IF EQU(H,"PLOT") THEN GO PLOT;
IF EQU(H,"SAVE") THEN GO SAV;
IF EQU(H,"NO") THEN GO NO;
IF EQU(H,"INPUT") THEN GO INP;
IF EQU(H,"RECEIVE") THEN GO RECEV;
IF EQU(H,"H") THEN DHOLD←1 ELSE
IF EQU(H,"D") THEN BEGIN DHOLD←0; UPPDAT; END ELSE
IF EQU(H,"MOVE") THEN
BEGIN
IRX←IRX-ISCX*NUMI;
IRY←IRY-ISCY*NUMI;
TRANSUP;
END ELSE
IF EQU(H,"UPDIS") THEN
BEGIN
DFORCE ← 1;
DICH[0] ← NUMI;
UPPDAT;
DFORCE ← 0;
END ELSE
IF EQU(H,"BLANK") THEN LOOP(IA,1,35,1) OUTSTR(CL) ELSE
IF EQU(H,"CLEAR") THEN K_ZERO ELSE
IF EQU(H,"CLOSE") THEN K_OUT;
COM2: IF BRCHAR≠'12 THEN BEGIN H←QREAD; WHERE←1; GO COM1 END;
GO COMND;
_ sub-command decoding - DO, MARK, UNMARK, PLOT;
DOIT: IF EQU(H←QREAD,"FILE") THEN
BEGIN
OPEN(MCHN[CFILES+1]←GETCHAN,"DSK",0,2,0,900,BRCHAR,MEOF);
LOOKUP(MCHN[CFILES+1],MFILE←QREAD,IA);
IF IA THEN BEGIN OUTSTR(" WHAT FILE?"); GO COMND END;
CMSAV[CFILES←CFILES+1]←COMSTR;
COMSTR←NULL;
END ELSE IF EQU(H,"COM") THEN
COMSTR←CMSTRS[NUMI]&COMSTR
ELSE BEGIN QUEST; GO COMND END;
MODE←1;
GO COMND;
DD: GO COMND; _ A breakpoint here is a convenient way to get into RAID;
MARK: H←QREAD;
IF EQU(H,"EDGES") THEN DISP[3]←1 ELSE
IF EQU(H,"VERTICES") THEN DISP[6]←1 ELSE
IF EQU(H,"LINES") THEN DISP[5]←1 ELSE GO COM1;
UPPDAT;
QUNFIN MARK;
UNMARK: H←QREAD;
IF EQU(H,"EDGES") THEN DISP[3]←0 ELSE
IF EQU(H,"VERTICES") THEN DISP[6]←0 ELSE
IF EQU(H,"LINES") THEN DISP[5]←0 ELSE GO COM1;
UPPDAT;
QUNFIN UNMARK;
PLOT: TELL("plotting");
LOOP(IA,1,14,1) BEGIN DISPS[IA]←DISP[IA]; DISP[IA]←0 END;
WHILE BRCHAR≠'12 DO DISP[NUMI]←1;
PLT←1;
UPPDAT;
PRECAL;
CALC;
LOOP(IA,1,14,1) DISP[IA]←DISPS[IA];
UPPDAT;
UNTELL;
PLT←0;
GO COMND;
_ more sub-command decoding - EDIT, KILL, PRINT;
EDIT: H←QREAD;
IF EQU(H,"PARAM") THEN SETPAR ELSE
IF EQU(H,"LINES") THEN
BEGIN
LINED;
IF WHERE=5∨WHERE=6 THEN
BEGIN
IF EQU(LIEXT,".TEM") THEN LISAVE;
NODIS←1;
GO BL3;
END;
END ELSE
IF EQU(H,"PROT") THEN
BEGIN
EDLIN←NUMI;
COM3: CREPRO;
IF WHERE≥18 THEN
BEGIN
NODIS←1;
IF EQU(LIEXT,".TEM") THEN LISAVE;
IF EQU(EDEXT,".TEM") THEN EDSAVE;
IF EQU(PREXT,".TEM") THEN PRSAVE;
TELL("prot-expand");
GO BL1;
END;
IF WHERE=16 THEN
BEGIN
NODIS←1;
IF EQU(LIEXT,".TEM") THEN LISAVE;
GO BL3;
END;
END ELSE
IF EQU(H,"COM") THEN COMST ELSE GO COM1;
QUNFIN EDIT;
KILL: H←QREAD;
IF EQU(H,"FRAME") THEN DISP[1]←0 ELSE
IF EQU(H,"EDGES") THEN BEGIN DISP[2]←DISP[3]←0 END ELSE
IF EQU(H,"LINES") THEN DISP[4]←DISP[5]←DISP[6]←0 ELSE GO COM1;
UPPDAT;
QUNFIN KILL;
PRINT: H←QREAD;
IF EQU(H,"REGREF") THEN REGREF(NUMI) ELSE
IF EQU(H,"EDGES") THEN EDGPRT ELSE GO COM1;
QUNFIN PRINT;
_ more sub-command decoding - SET;
SETT: H←QREAD;
IF EQU(H,"SCALE") THEN
BEGIN
ISCX←1./QRSET(DSCX);
ISCY←1./QRSET(DSCY);
TRANSUP;
END ELSE
IF EQU(H,"BRTSIZ") THEN
BEGIN
DBRSI[IB←NUMI]←'46 LOR (NUMI LSH
(IF IB≤2∨IB=4 THEN 11 ELSE 8));
DICH[IB]←1;
UPPDAT
END ELSE
IF EQU(H,"FULREC") THEN QSET(FULREC) ELSE
IF EQU(H,"LOC") THEN TYPLOC(QSET(LOCT),QSET(LOCB)) ELSE
IF EQU(H,"WHAT") THEN QSET(IWHAT) ELSE
IF EQU(H,"TRACE") THEN QSET(MTRACE) ELSE
IF EQU(H,"XTRACE") THEN QSET(XTRACE) ELSE
IF EQU(H,"CVLIN") THEN BEGIN QSET(CVLIN);DICH[4]←1;UPPDAT END ELSE
IF EQU(H,"WIND") THEN QSET(WIND) ELSE
IF EQU(H,"LDATE") THEN QSET(LDATE) ELSE
IF EQU(H,"NAME") THEN
BEGIN
OUTSTR(" NAME = "&NAME&" ← ");
NAME←QREAD;
NOUT←NGRF←NLPT←"A"
END ELSE
IF EQU(H,"LNCRE") THEN
BEGIN
QSET(LNCRE1);
QSET(LNCRE2);
DICH[4]←DICH[5]←DICH[6]←1;
UPPDAT
END ELSE
IF EQU(H,"DISRPT") THEN BEGIN QSET(DRX);QSET(DRY);TRANSUP END ELSE
IF EQU(H,"INTRPT") THEN BEGIN QRSET(IRX); QRSET(IRY); TRANSUP END
ELSE GO COM1;
QUNFIN SETT;
_ more sub-command decoding - CALL;
CALL: H←QREAD;
CALL1: IF EQU(H,"LINFIT") THEN
BEGIN
INITIA;
IF WHERE=1 THEN TELL("line-fit");
WHERE←1;
IDUM←LINFIT;
IF IDUM THEN
BEGIN
WHERE←2;
TELL("expanding");
NOL ← NOV ← 0;
GO BL3
END ELSE BEGIN
DICH[4]←DICH[5]←DICH[6]←1;
UPPDAT;
UNTELL
END
END ELSE
IF EQU(H,"SORTED") THEN BEGIN SORTED; DICH[3]←1; UPPDAT END ELSE
IF EQU(H,"UNXREF") THEN BEGIN UNXREF;GO TO UPLIN; END ELSE
IF EQU(H,"FTEX") THEN FTEX ELSE
IF EQU(H,"PARSE") THEN
BEGIN
MAPTRC←MAPCONV(QREAD);
IF ¬NPRO THEN
BEGIN OUTSTR("No prototypes"&CL); GO COMND; END;
IF NOL>0.65*MAXNOL THEN
BEGIN
NOBAL←(1.6*NOL-MSAFA)/RMSAF+1;
TELL("expanding");
IF EQU(LIEXT,".TEM") THEN LISAVE;
NODIS←1;
WHERE←20;
GO BL3
END;
CPA: LIEXT←".TEM";
WHERE←1;
PARSE
END ELSE
IF EQU(H,"XREF") THEN
BEGIN XREFC(NUMI);
UPLIN: DICH[6]←1;
IF CVLIN THEN DICH[4]←1;
UPPDAT
END ELSE GO COM1;
QUNFIN CALL;
_ more sub-command decoding - SHOW;
SHOW: H←QREAD;
IF EQU(H,"INTRPT") THEN
OUTSTR(" ("&CVS(DISX(IRX))&","&CVS(DISY(IRY))&")"&CL) ELSE
IF EQU(H,"LNFEAT") THEN
BEGIN
IDUM←LNFEAT(NUMI);
OUTSTR(EXPL(IDUM,'430771430771,"{#≥#≤∧-∀-.≡#≥#≤∧-∀-.}")&
(QFTREV)&" ENTRY: "&CVS(FINDFT(IDUM))&CL)
END ELSE
IF EQU(H,"COFEAT") THEN
BEGIN
LOOP(IA,1,2,1) BEGIN IB←IDUM; IDUM←NUMI; IC←ID;
ID←FINDFT(LNFEAT(IDUM))*(FTREV=1) END;
IDUM←COFEAT(IB,IDUM,IC,ID);
OUTSTR(EXPL(IDUM,'401437401437,"{*→@∀---≡*→@∀---}")&(QFTREV)&
" ENTRY: "&CVS(FINDFT(IDUM))&CL)
END ELSE
IF EQU(H,"CFEAT")∧(IDUM←NUMI+PLFTOT)≤PFTOT THEN
BEGIN
IDUM←BITS(PFPTR[IDUM],12,23);
WHILE IDUM DO
OUTSTR(CVS(IDUM)&" → L1: "&CVS((IA←BITS(IDUM←
CFEAT[IDUM],24,35)) LAND '3777)&" "&
CVS(IA LSH -11)&" L2: "&CVS((IA←BITS(IDUM,12,23))
LAND '3777)&" "&CVS(IA LSH -11)&" → "&
CVS(IDUM←IDUM LAND '7777)&CL)
END ELSE
IF EQU(H,"LFDIF") THEN
BEGIN
IA←LNFEAT(NUMI);
IB←-(FTREV=1);
IC←LNFEAT(NUMI);
ID←-(FTREV=1);
OUTSTR(EXPL(LFDIF(IA,IC,NUMI XOR IB,NUMI XOR ID,FALSE),
'742105742105,"{-≥-#SEC≡-≥-#SEC}")&
" + "&EXPL(MODIF,'252525252525,"{-----------------}")&CL)
END ELSE
IF EQU(H,"FRAME") THEN DISP[1]←1 ELSE
IF EQU(H,"EDGES") THEN
BEGIN
IA←IAEDG;
IAEDG←NUMI;
DISP[2]←1;
IF IA≠IAEDG THEN DICH[2]←1
END ELSE
IF EQU(H,"LINES") THEN DISP[4]←1 ELSE GO COM1;
UPPDAT;
QUNFIN SHOW;
_ more sub-command decoding - NO, SAV;
NO: H←QREAD;
IF EQU(H,"EDGES") THEN
BEGIN
EDEXT←".TEM";
IF EQU(LIEXT,".TEM") THEN LISAVE;
NOEPA←0;
DICH[2]←DICH[3]←1;
UPPDAT;
NODIS←1;
WHERE←3;
GO BL2
END ELSE
IF EQU(H,"LINES") THEN
BEGIN
LIEXT←".TEM";
NOBAL←NOL←0;
DICH[4]←DICH[5]←DICH[6]←1;
UPPDAT;
WHERE←7;
GO BL3
END ELSE GO COM1;
NO1: WHERE←1;
QUNFIN NO;
SAV: H←QREAD;
IF EQU(H,"EDGES") THEN BEGIN FILESP(2); EDSAVE END ELSE
IF EQU(H,"LINES") THEN BEGIN SHUFFL; FILESP(1); LISAVE END ELSE
IF EQU(H,"PROT") THEN BEGIN FILESP(3); PRSAVE END ELSE
IF EQU(H,"STRUCT") THEN OUTLINES ELSE GO COM1;
QUNFIN SAV;
_ more sub-command decoding - RECEIVE;
RECEV: IF MODE≥0 THEN
BEGIN "ERR2"
OUTSTR("RECEIVE COMMAND ONLY LEGAL AS M.P. !!"&CL);
GO COM2;
END "ERR2";
H ← QREAD;
IF EQU(H,"EDGES") THEN
BEGIN "MEDGE"
INTEGER MESS;
MESS ← GET_ENTRY('70,"EDGE","GUNLO","G_EDGES");
IF ¬MESS THEN
BEGIN "ERR1"
OUTSTR("NO EDGE DATA AVAILABLE"&CL);
GO COM2;
END "ERR1";
QUEUE('600,MESS);
NOL ← NOV ← 0;
IF NOEPL<NOEPA THEN
BEGIN "EXP"
WHERE ← 10;
NOBAL ← NOEPA*RDEP/8.;
TELL("EDGE-EXPAND");
GO BL2;
END "EXP";
REC1: WHERE ← 1;
EDREC;
END "MEDGE" ELSE GO COM1;
UPPDAT;
QUNFIN RECEV;
_ end of sub-command decoding - INPUT;
INP: H←QREAD;
IF EQU(H,"EDGES") THEN
BEGIN
FILESP(2);
EDREST;
QERR;
IF WHERE=11 THEN
BEGIN
NOBAL←NOEPA*RDEP/8.;
TELL("edge-expand");
GO BL2
END;
END ELSE
IF EQU(H,"LINES") THEN
BEGIN
FILESP(1);
LIREST;
QERR;
DICH[4]←DICH[5]←DICH[6];
IF WHERE=8 THEN
BEGIN
TELL("line-expand");
GO BL3
END;
END ELSE
IF EQU(H,"PROT") THEN
BEGIN
FILESP(3);
PRREST;
QERR;
IF WHERE=17 THEN
BEGIN
TELL("prot-expand");
GO BL1
END
END ELSE GO COM1;
INP1: WHERE←1;
UPPDAT;
QUNFIN INP;
_ * * * * * THAT WAS THE END OF THE COMMAND-LOOP * * * * *;
END "BLOCK3";
END "BLOCK2";
END "BLOCK1";
END "GUNLO";_ END OF GUNLOK ;